﻿using EasyNet.Componets.Core.Pagers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace EasyNet.Componets.Core.Domain
{
    /// <summary>
    /// 泛型仓储
    /// </summary>
    /// <typeparam name="TAggregateRoot">聚合根类型</typeparam>
    public interface IRepository<TAggregateRoot>
        where TAggregateRoot : class, IAggregateRoot
    {
        #region Methods
        /// <summary>
        /// 将指定的聚合根添加到仓储中。
        /// </summary>
        /// <param name="aggregateRoot">需要添加到仓储的聚合根实例。</param>
        void Add(TAggregateRoot aggregateRoot);

        /// <summary>
        /// 根据聚合根的ID值，从仓储中读取聚合根。
        /// </summary>
        /// <param name="key">聚合根的ID值。</param>
        /// <returns>聚合根实例。</returns>
        TAggregateRoot GetByKey(string key);

        /// <summary>
        /// 通过条件获取聚合根
        /// </summary>
        /// <param name="predicate">过滤条件</param>
        /// <returns>聚合根实例。</returns>
        TAggregateRoot Get(Expression<Func<TAggregateRoot, bool>> predicate);

        /// <summary>
        /// 获取所有聚合根列表
        /// </summary>
        /// <returns>聚合根实例列表</returns>
        List<TAggregateRoot> List();

        /// <summary>
        /// 通过条件获取聚合根列表
        /// </summary>
        /// <param name="specification">条件参数</param>
        /// <returns>聚合根实例列表</returns>
        List<TAggregateRoot> List(Expression<Func<TAggregateRoot, bool>> predicate);

        /// <summary>
        /// 返回一个<see cref="Boolean"/>值，该值表示符合指定规约条件的聚合根是否存在。
        /// </summary>
        /// <param name="predicate">过滤条件</param>
        /// <returns>如果符合指定规约条件的聚合根存在，则返回true，否则返回false。</returns>
        bool Exist(Expression<Func<TAggregateRoot, bool>> predicate);

        /// <summary>
        /// 将指定的聚合根从仓储中移除。
        /// </summary>
        /// <param name="aggregateRoot">需要从仓储中移除的聚合根。</param>
        /// 
        void Remove(TAggregateRoot aggregateRoot);

        /// <summary>
        /// 更新指定的聚合根。
        /// </summary>
        /// <param name="aggregateRoot">需要更新的聚合根。</param>
        void Update(TAggregateRoot aggregateRoot);

        /// <summary>
        /// 根据指定的规约，以指定的排序字段和排序方式，以及分页参数，从仓储中读取所有聚合根。
        /// </summary>
        /// <param name="pagerQuery">分页查询</param>
        /// <returns>分页结果</returns>
        PagerResult<TAggregateRoot> ListInPage(PagerQuery pagerQuery);
        #endregion
    }
}
